<?

/**
 * Comunicaciones class
 *
 * Esta clase maneja las comunicaciones de un cliente
 * @author Alejandro Garcia del Rio <alejandro.garciadelrio@elserver.com>
 * @version 1.0
 * @package Comunicaciones
*/
class Comunicaciones extends Core {

	static protected $instancia;
	static protected $opciones = array(
	);
	private $id_cliente = null;
	private $count = 0;

	function __construct ($id_cliente=null, $opciones=null) {
		// Llamo al constructor del parent tambien
		parent::__construct();
		// Guardo las opciones si me definio alguna
		if ($opciones)
			$this->opciones($opciones);
		// Seteo el id de este cliente
		if ($id_cliente && $this instanceof self)
			$this->id_cliente($id_cliente);
	}

	/**
	 * Devuelve una unica instancia de esta clase
	 * 
	 * @return object Instancia de esta clase
	 */
	public static function getInstance() {
		if (!self::$instancia instanceof self)
			self::$instancia = new self;
		return self::$instancia;
	}

	/**
	 * Setea las opciones 
	 * 
	 * @param array $opciones (opcional) Opciones validas para esta clase. Si esta vacio, funciona como un getter.
	 * @return array $opciones Listado de opciones
	 */
	public function opciones ($opciones=null) {
		return self::$opciones = parent::opciones(self::$opciones, $opciones);
	}

	/**
	 * Setea y/o devuelve el id de este cliente
	 * 
	 * @param string $id_cliente (Opcional) El id del cliente (si se quiere usar como setter tambien)
	 * @return integer El id del cliente
	 */
	public function id_cliente ($id_cliente=null) {

		// Si me paso el id_cliente lo seteo
		if ($id_cliente)
			$this->id_cliente = addslashes($id_cliente);
		
		return $this->id_cliente;
	}

	/**
	 * Agregar una comunicacion para este cliente
	 * 
	 * @param string|array $comunicacion La comunicacion a agregar para este cliente o un array en donde la comunicacion sea la key 'comunicacion'
	 * @param string $id_cliente (Opcional) El id_cliente al que se le quiere agregar la comunicacion
	 * @return integer
	 */
	function agregar ($comunicacion, $id_cliente=null) {

		// Saneamiento de variables
		if (is_array($comunicacion))
			$_comunicacion = addslashes($comunicacion['comunicacion']);
		else
			$_comunicacion = addslashes($comunicacion);
		
		// Seteo el cliente
		if (($id_cliente) && $this instanceof self)
			$this->id_cliente($id_cliente);

		// Si esta instanciada la clase, uso $this
		if ($this instanceof self)
			$id_cliente = $this->id_cliente();

		// Valido que tenga un id este caso
		if (!$id_cliente)
			return ($this)? $this->fail('No hay un cliente especificado') : false;

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo el objeto de sesion
		$Session = Session::getInstance();

		// Agrego la comunicacion
		$id_comunicacion = $db->insert('clientes_comunicaciones', array('id_cliente' => $id_cliente, 'id_usuario' => $Session->get('usuario.id'), 'comunicacion' => $_comunicacion));

		// Mando la comunicacion por mail
		if (!empty($comunicacion['destinatarios'][0])) {

			// Obtengo los datos del cliente
			$cliente = Cliente::get($id_cliente);

			$from = $Session->get('usuario.nombre').' <sonsantas@mangolabs.com.ar>';
			$subject = $Session->get('usuario.nombre').' acaba de agregar una comunicacion para el cliente '.$cliente['nombre'].' '.$cliente['apellido'];
			$body .= '<html><head><title>'.$subject.'</title></head>' . 
					'<body><h1>'.$Session->get('usuario.nombre').' escribio: </h1><p>'.$_comunicacion.'</p>' . 
					'<p><a href="'.CONFIG_SITE_URL.'ss/clientes/editar/'.$id_cliente.'" target="_blank">Para contestar podes ingresar ac&aacute;</a></p></body></html>';

			// Defino los encabezados
/*
			$headers  = 'MIME-Version: 1.0' . "\r\n";
			$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
			$headers .= 'From: '.$from . "\r\n";
*/
			$headers = array();
			$headers['Content-type'] 	= 'text/html; charset=iso-8859-1';
			$headers['From'] 			= $from;
			$headers['Subject'] 		= $subject;

			// Configuro el smtp
			$params["auth"]			= true; // note: there are *no delimiters*
			$params["debug"]		= true; 
			$params["host"]			= CONFIG_SMTP_HOST;
			$params["port"]			= CONFIG_SMTP_PORT;
			$params["username"]		= CONFIG_SMTP_USER;
			$params["password"]		= CONFIG_SMTP_PASS;

			include_once('Mail.php');
			include_once('Mail/mime.php');

			foreach ($comunicacion['destinatarios'] as $destinatario)
				if (!empty($destinatario)) {
					//mail($destinatario, $subject, $body, $headers);

					// Instancio un nuevo mail smtp
					$mail =& Mail::factory('smtp', $params);

					// Hago el envio y chequeo que haya salido bien
					$res = $mail->send($destinatario, array_merge($headers, array('To' => $mensaje['destinatario'])), $body);
					if (PEAR::isError($res)) {
						return ($this)? $this->fail('Error al enviar mail: '.$res->getMessage()) : false;
					}

				}
		}

		return $id_comunicacion;
	}

	/**
	 * Lista las comunicaciones de un cliente
	 * 
	 * @param string $id_cliente (Opcional) El id_cliente del que se quieren sus comunicaciones
	 * @param string $opciones (Opcional) Opciones validas para esta clase
	 * @return array
	 */
	function listar ($id_cliente=null, $opciones=null) {

		// Seteo el cliente
		if (($id_cliente) && $this instanceof self)
			$this->id_cliente($id_cliente);

		// Si esta instanciada la clase, uso $this
		if ($this instanceof self)
			$id_cliente = $this->id_cliente();

		// Valido que tenga un id este caso
		if (!$id_cliente)
			return ($this)? $this->fail('No hay un cliente especificado') : false;

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo las comunicaciones del cliente
		$query = "SELECT cl.*, u.nombre usuario
		FROM clientes_comunicaciones cl
		LEFT JOIN usuarios u ON cl.id_usuario = u.id_usuario
		WHERE cl.id_cliente = '$id_cliente'
		ORDER BY ctime DESC";
		
		$comunicaciones = array();
		if ($_comunicaciones = $db->get_results($query))
			foreach ($_comunicaciones as $_comunicacion)
				$comunicaciones[$_comunicacion['id_comunicacion']] = array_merge($_comunicacion, array('fecha' => strftime("%A %e de %B de %Y, %T hs", strtotime($_comunicacion['ctime']))));

		return $comunicaciones;
	}


/********************************************************************************/

	/**
	 * Cambia el estado de este cliente
	 * 
	 * @param integer $id_estado El nuevo estado para el cliente
	 * @param string $id_cliente (Opcional) El id_cliente al que se le quiere cambiar el estado
	 * @return boolean
	 */
	private function cambiar_estado ($id_estado, $id_cliente=null) {

		// Saneamiento de variables
		$id_estado = addslashes($id_estado);
		$id_cliente = addslashes($id_cliente);
		
		// Seteo el cliente
		if (($id_cliente) && $this instanceof self)
			$this->id($id_cliente);

		// Si esta instanciada la clase, uso $this
		if ($this instanceof self)
			$id_cliente = $this->id();

		// Valido que tenga un id este caso
		if (!$id_cliente)
			return ($this)? $this->fail('No hay un cliente especificado') : false;

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Cambio el estado del cliente
		$db->update('clientes', array('id_cliente' => $id_cliente, 'id_estado' => $id_estado));

		return true;
	}

	/**
	 * Cambia el estado de este cliente a nuevo
	 * 
	 * @param string $id_cliente (Opcional) El id_cliente al que se le quiere cambiar el estado
	 * @return boolean
	 */
	public function nuevo ($id_cliente=null) {

		// Obtengo el objeto de acl
		$acl = new ACL($Session->get('usuario.id'));

		// Valido que el usuario tenga los permisos para ejecutar esta accion
		if (!$acl->get('CLIENTE_ESTADO_NUEVO', 'AGREGAR'))
			return ($this)? $this->fail(($acl->error_msg)? $acl->error_msg : 'No tiene permisos para modificar el estado del cliente a nuevo') : false;

		return ($this instanceof self)? $this->cambiar_estado(1, $id_cliente) : self::cambiar_estado(1, $id_cliente);
	}

	/**
	 * Cambia el estado de este cliente a contactado
	 * 
	 * @param string $id_cliente (Opcional) El id_cliente al que se le quiere cambiar el estado
	 * @return boolean
	 */
	public function contactado ($id_cliente=null) {

		// Obtengo el objeto de acl
		$acl = new ACL($Session->get('usuario.id'));

		// Valido que el usuario tenga los permisos para ejecutar esta accion
		if (!$acl->get('CLIENTE_ESTADO_CONTACTADO', 'AGREGAR'))
			return ($this)? $this->fail(($acl->error_msg)? $acl->error_msg : 'No tiene permisos para modificar el estado del cliente a contactado') : false;

		return ($this instanceof self)? $this->cambiar_estado(2, $id_cliente) : self::cambiar_estado(2, $id_cliente);
	}

	/**
	 * Cambia el estado de este cliente a cerrado
	 * 
	 * @param string $id_cliente (Opcional) El id_cliente al que se le quiere cambiar el estado
	 * @return boolean
	 */
	public function cerrado ($id_cliente=null) {

		// Obtengo el objeto de acl
		$acl = new ACL($Session->get('usuario.id'));

		// Valido que el usuario tenga los permisos para ejecutar esta accion
		if (!$acl->get('CLIENTE_ESTADO_CERRADO', 'AGREGAR'))
			return ($this)? $this->fail(($acl->error_msg)? $acl->error_msg : 'No tiene permisos para modificar el estado del cliente a cerrado') : false;

		return ($this instanceof self)? $this->cambiar_estado(3, $id_cliente) : self::cambiar_estado(3, $id_cliente);
	}

	/**
	 * Cambia el estado de este cliente a inactivo
	 * 
	 * @param string $id_cliente (Opcional) El id_cliente al que se le quiere cambiar el estado
	 * @return boolean
	 */
	public function inactivo ($id_cliente=null) {

		// Obtengo el objeto de acl
		$acl = new ACL($Session->get('usuario.id'));

		// Valido que el usuario tenga los permisos para ejecutar esta accion
		if (!$acl->get('CLIENTE_ESTADO_INACTIVO', 'AGREGAR'))
			return ($this)? $this->fail(($acl->error_msg)? $acl->error_msg : 'No tiene permisos para modificar el estado del cliente a inactivo') : false;

		return ($this instanceof self)? $this->cambiar_estado(4, $id_cliente) : self::cambiar_estado(4, $id_cliente);
	}

	/**
	 * Modifica los datos de un cliente
	 * 
	 * @param array $cliente Los nuevos datos de este cliente
	 * @param array $id_cliente (Opcional) El id de cliente que se quiere modificar
	 * @return boolean
	 */
	public function modificar ($cliente, $id_cliente=null) {

		// Obtengo el objeto de sesion
		$Session = Session::getInstance();

		// Obtengo el objeto de acl
		$acl = new ACL($Session->get('usuario.id'));

		// Valido que el usuario tenga los permisos para ejecutar esta accion
//		if (!$acl->get('CLIENTE', 'MODIFICAR'))
//			return ($this)? $this->fail(($acl->error_msg)? $acl->error_msg : 'No tiene permisos para modificar los datos de un cliente') : false;

		// Seteo el cliente
		if (($id_cliente) && $this instanceof self)
			$this->id($id_cliente);

		// Si esta instanciada la clase, uso $this
		if ($this instanceof self)
			$id_cliente = $this->id();

		// Valido que tenga un id este caso
		if (!$id_cliente)
			return ($this)? $this->fail('No hay un cliente especificado') : false;

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();
		
		// Actualizo
		$db->update('clientes', array_merge($cliente, array('id_cliente' => $id_cliente)));

		return true;
	}

	/**
	 * Devuelve la informacion de un cliente
	 * 
	 * @param integer $id_cliente (Opcional) El id del cliente del que se quiere la informacion
	 * @return array
	 */
	public function get ($id_cliente=null) {

		// Seteo el cliente
		if (($id_cliente) && $this instanceof self)
			$this->id($id_cliente);

		// Si esta instanciada la clase, uso $this
		if ($this instanceof self)
			$id_cliente = $this->id();

		// Valido que tenga un id este caso
		if (!$id_cliente)
			return ($this)? $this->fail('No hay un cliente especificado') : false;

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();
		
		// Obtengo el cliente
		$cliente = $db->get_row("SELECT * FROM clientes WHERE id_cliente = '$id_cliente'");

		return $cliente;
	}

	/**
	 * Chequea si existe este cliente en la base
	 * 
	 * @param string $cliente El nombre del cliente que se quiere saber si existe
	 * @return boolean
	 */
	public function existe ($nombre, $apellido) {

		// Saneamiento de variables
		$nombre = addslashes($nombre);
		$apellido = addslashes($apellido);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo el cliente
		$info = $db->get_row("SELECT * FROM clientes WHERE nombre = '$nombre' AND apellido = '$apellido'");

		return $info;
	}

	/**
	 * Devuelve el listado de citas de este cliente
	 * 
	 * @param integer $id_cliente (Opcional) El id de cliente del que se quieren las citas
	 * @return boolean
	 */
	public function citas ($id_cliente=null) {

		// Seteo el cliente
		if (($id_cliente) && $this instanceof self)
			$this->id($id_cliente);

		// Si esta instanciada la clase, uso $this
		if ($this instanceof self)
			$id_cliente = $this->id();

		// Valido que tenga un id este caso
		if (!$id_cliente)
			return ($this)? $this->fail('No hay un cliente especificado') : false;

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();
		
		// Obtengo el dominio
		$cliente = $db->get_row("SELECT * FROM clientes WHERE id_cliente = '$id_cliente'");

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo las citas del cliente
		$info = $db->get_row("SELECT * FROM clientes WHERE nombre = '$cliente'");

		return $info;
	}

}

?>
